package org.juliette.wordsite.client;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Random;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.KeyboardListenerAdapter;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class WordSite implements EntryPoint {
    String [] [] woordenLijst = {
            {"table", "bord"},
            {"door", "doras"},
            {"chair", "cathaoir"},
            {"cheese", "cáis"}
    };
    
    TextBox tekstVeld;
    Label vraagLabel;
    Label resultaatLabel;
    Button voerInbutton;
    Map woorden = leesWoorden();
    String huidigeWoord = geefRandomWoord();

    public void onModuleLoad() {
        vraagLabel = new Label("What is " + huidigeWoord + "? ");
        tekstVeld = new TextBox();
        tekstVeld.addKeyboardListener(new KeyboardListenerAdapter() {
            public void onKeyPress(Widget sender, char keyCode, int modifiers) {
                if (keyCode == 13) {
                    controlleerWoord();
                }
            }
        });
        voerInbutton = new Button("Enter");
        voerInbutton.addClickListener(new ClickListener() {
            public void onClick(Widget sender) {
                controlleerWoord();
            }
            
        });
        resultaatLabel = new Label();
        
        Panel mainPanel = new VerticalPanel();

        Panel p = new HorizontalPanel();
        p.add(vraagLabel);
        p.add(new Label("   "));
        p.add(tekstVeld);
        p.add(new Label("   "));
        p.add(voerInbutton);
        p.add(new Label("   "));
        p.add(resultaatLabel);
        
        mainPanel.add(p);
        mainPanel.add(new Label("  "));
        
        maakSpecialeTekensKnoppen(mainPanel);
        RootPanel.get().add(mainPanel);
        tekstVeld.setFocus(true);        
    }

    void controlleerWoord() {
        if (tekstVeld.getText().trim().equals(woorden.get(huidigeWoord))) {
            resultaatLabel.setText(" Very good. This is correct!");
            woorden.remove(huidigeWoord);
            huidigeWoord = geefRandomWoord();
            vraagLabel.setText("What is " + huidigeWoord + "? ");
        } else {
            resultaatLabel.setText(" Incorrect. Try again.");
        }
        tekstVeld.setText("");
        tekstVeld.setFocus(true);
    }

    Map leesWoorden() {
         Map w = new HashMap();
         for (int i=0; i < woordenLijst.length; i++) {
             w.put(woordenLijst[i][0], woordenLijst[i][1]);
         }
         return w;
    }
    
    String geefRandomWoord() {
        if (woorden.size() == 0) {
            resultaatLabel.setText("You answered all the questions. Thanks!");
            return ""; // eigenlijk een andere woordenlijst doen
        }
        
        List l = new ArrayList(woorden.keySet());
        int woord = Random.nextInt(l.size());
        return (String) l.get(woord);
    }

    void maakSpecialeTekensKnoppen(Panel mainPanel) {
        Panel p = new HorizontalPanel();
        mainPanel.add(p);

        maakSpecialeKnop("á", p);
        maakSpecialeKnop("é", p);
        maakSpecialeKnop("ó", p);
        maakSpecialeKnop("ú", p);
        maakSpecialeKnop("í", p);
    }

    private void maakSpecialeKnop(String letter, Panel panel) {
        Button a = new Button(letter);        
        a.addClickListener(new InsertCharacterClickListener(tekstVeld, a));
        panel.add(a);
    }    
}
